﻿/***************************************************************
 * 开发人员：网魂小兵@http://www.mozlite.com
 * 
 * 用户安全数据库提供者。
 * 
 * 最后修改：2011-10-30
 * ************************************************************/
namespace Mozlite.Common
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data.Common;
    using Mozlite.Data;


    /// <summary>
    /// 用户安全数据库提供者。
    /// </summary>
    public abstract class SecurityDataProvider : ProviderBase<SecurityDataProvider>
    {
        /// <summary>
        /// 初始化类<see cref="T:Mozlite.Common.SecurityDataProvider"/>。
        /// </summary>
        /// <param name="factory">数据库工厂实例对象。</param>
        protected SecurityDataProvider(DbProviderFactory factory):base(factory) { }

        #region roles
        /// <summary>
        /// 将用户添加用户组。
        /// </summary>
        /// <param name="roles">用户组列表。</param>
        public abstract void AddRoles(List<UserRole> roles);
        /// <summary>
        /// 创建或更新角色信息。
        /// </summary>
        /// <param name="role">角色<see cref="T:Mozlite.Common.Role"/>实例对象。</param>
        /// <returns>如果创建或更新角色返回<c>true</c>，否则返回<c>false</c>。</returns>
        public abstract bool SaveRole(Role role);
        /// <summary>
        /// 加载所有角色。
        /// </summary>
        /// <param name="settingsID">网站配置ID。</param>
        /// <returns>返回所有用户组。</returns>
        public abstract Dictionary<int, Role> LoadRoles(int settingsID);
        /// <summary>
        /// 删除角色。
        /// </summary>
        /// <param name="settingsID">网站配置ID。</param>
        /// <param name="roleIDs">角色ID集合，以“,”分割。</param>
        /// <returns>如果成功删除，则返回<c>true</c>，否则返回<c>false</c>。</returns>
        public abstract bool DeleteRoles(int settingsID, string roleIDs);
        /// <summary>
        /// 获取角色实例。
        /// </summary>
        /// <param name="settingsID">网站配置ID。</param>
        /// <param name="roleID">角色ID。</param>
        /// <returns>返回角色实例。</returns>
        public abstract Role GetRole(int settingsID, int roleID);
        /// <summary>
        /// 获取用户角色列表。
        /// </summary>
        /// <param name="settingsID">网站配置ID。</param>
        /// <param name="userID">用户ID。</param>
        /// <returns>返回用户角色列表。</returns>
        public abstract List<Role> GetRoles(int settingsID, int userID);
        /// <summary>
        /// 获取用户角色列表，角色ID为键。
        /// </summary>
        /// <param name="settingsID">网站配置ID。</param>
        /// <param name="userID">用户ID。</param>
        /// <returns>返回用户角色列表。</returns>
        public abstract Dictionary<int, UserRole> GetUserRoles(int settingsID, int userID);
        /// <summary>
        /// 将以','分割的角色ID的角色添加给当前用户。
        /// </summary>
        /// <param name="settingsID">网站配置ID。</param>
        /// <param name="userID">用户ID。</param>
        /// <param name="roleIDs">以','分割的角色ID。</param>
        /// <param name="enabledDate">生效时间。</param>
        /// <param name="expiredDate">过期时间。</param>
        public abstract void AddRoles(int settingsID, int userID, string roleIDs, DateTime enabledDate, DateTime expiredDate);
        /// <summary>
        /// 移除用户的角色信息。
        /// </summary>
        /// <param name="settingsID">网站配置ID。</param>
        /// <param name="userID">用户ID。</param>
        /// <param name="roleIDs">角色ID集合。</param>
        public abstract void RemoveRoles(int settingsID, int userID, string roleIDs);
        /// <summary>
        /// 获取当前角色的用户。
        /// </summary>
        /// <param name="settingsID">网站配置ID。</param>
        /// <param name="roleID">角色ID。</param>
        /// <returns>返回当前角色用户名称列表。</returns>
        public abstract List<string> GetUsers(int settingsID, int roleID);
        /// <summary>
        /// 获取角色ID。
        /// </summary>
        /// <param name="settingsID">网站配置ID。</param>
        /// <param name="roleName">角色名称。</param>
        /// <returns>返回角色ID。</returns>
        public abstract int GetRoleID(int settingsID, string roleName);
        #endregion

        #region currency
        /// <summary>
        /// 保存钱币。
        /// </summary>
        /// <param name="currency">钱币实例对象。</param>
        /// <returns>返回执行结果。</returns>
        public abstract bool SaveCurrency(Currency currency);
        /// <summary>
        /// 删除钱币。
        /// </summary>
        /// <param name="settingsID">网站设置ID。</param>
        /// <param name="currencyID">钱币ID。</param>
        /// <returns>返回执行结果。</returns>
        public abstract bool DeleteCurrency(int settingsID, int currencyID);
        /// <summary>
        /// 获取钱币实例对象。
        /// </summary>
        /// <param name="settingsID">网站设置ID。</param>
        /// <param name="currencyID">钱币ID。</param>
        /// <returns>钱币实例对象。</returns>
        public abstract Currency GetCurrency(int settingsID, int currencyID);
        /// <summary>
        /// 加载当前站的所有钱币实例。
        /// </summary>
        /// <returns>当前站的所有钱币实例。</returns>
        public abstract Dictionary<string, Currency> LoadCurrencies(int settingsID);
        #endregion

        #region users
        /// <summary>
        /// 将用户设置为跨站管理员。
        /// </summary>
        /// <param name="userID">用户ID。</param>
        /// <param name="isGlobalAdministrator">是否为跨站管理员。</param>
        /// <returns>返回是否成功。</returns>
        public abstract bool SetGlobalAdministrator(int userID, bool isGlobalAdministrator);
        /// <summary>
        /// 编辑用户。
        /// </summary>
        /// <param name="user">用户实例对象。</param>
        /// <param name="uniqueEmail">是否使用唯一的Email。</param>
        /// <returns>返回创建用户状态。</returns>
        public abstract CreateUserStatus EditUser(User user, bool uniqueEmail);
        /// <summary>
        /// 创建新用户。
        /// </summary>
        /// <param name="user">用户实例对象。</param>
        /// <param name="uniqueEmail">是否使用唯一的Email。</param>
        /// <param name="publicKey">邀请码。</param>
        /// <returns>返回创建用户状态。</returns>
        public abstract CreateUserStatus CreateUser(User user, bool uniqueEmail, Guid publicKey);
        /// <summary>
        /// 修改密码。
        /// </summary>
        /// <param name="userID">用户ID。</param>
        /// <param name="password">新用户密码。</param>
        public abstract void ChangePassword(int userID, string password);
        /// <summary>
        /// 修改安全信息。
        /// </summary>
        /// <param name="userID">用户ID。</param>
        /// <param name="question">新用户问题。</param>
        /// <param name="answer">新用户答案。</param>
        public abstract void ChangeSecurityQuestAndAnswer(int userID, string question, string answer);
        /// <summary>
        /// 设置用户最后激活信息。
        /// </summary>
        /// <param name="userID">用户ID。</param>
        /// <param name="lastAction">最后行为信息。</param>
        /// <returns>返回日期。</returns>
        public abstract DateTime SetUserLastActivity(int userID, string lastAction);
        /// <summary>
        /// 获取用户。
        /// </summary>
        /// <param name="userID">用户ID。</param>
        /// <param name="userName">用户名称。</param>
        /// <param name="email">用户电子邮件。</param>
        /// <param name="isOnline">是否在线。</param>
        /// <returns>返回用户实例对象。</returns>
        public abstract User GetUser(int userID, string userName, string email, bool isOnline);
        /// <summary>
        /// 保存用户登录状态。
        /// </summary>
        /// <param name="userID">当前用户ID。</param>
        /// <param name="ip">登录IP。</param>
        public abstract void SetLogin(int userID, string ip);
        /// <summary>
        /// 验证失败，设置验证状态。
        /// </summary>
        /// <param name="user">当前用户实例。</param>
        /// <returns>返回是否成功。</returns>
        public abstract bool SetValidFailure(User user);
        /// <summary>
        /// 删除用户。
        /// </summary>
        /// <param name="userIDs">用户ID，以“,”分割。</param>
        /// <returns>返回删除结果。</returns>
        public abstract bool DeleteUsers(string userIDs);
        /// <summary>
        /// 通过电子邮件获取用户ID。
        /// </summary>
        /// <param name="email">用户电子邮件。</param>
        /// <returns>返回用户ID。</returns>
        public abstract int GetUserIDByEmail(string email);
        /// <summary>
        /// 通过用户名获取用户ID。
        /// </summary>
        /// <param name="userName">用户名。</param>
        /// <returns>返回用户ID。</returns>
        public abstract int GetUserIDByUserName(string userName);
        /// <summary>
        /// 保存头像。
        /// </summary>
        /// <param name="userID">用户ID。</param>
        /// <param name="avatar">头像。</param>
        /// <returns>返回是否保存成功。</returns>
        public abstract bool SaveAvatar(int userID, string avatar);
        /// <summary>
        /// 保存用户详细信息。
        /// </summary>
        /// <param name="user">用户实例对象。</param>
        /// <returns>返回创建用户状态。</returns>
        public abstract CreateUserStatus SaveProfile(User user);
        /// <summary>
        /// 更新用户状态信息。
        /// </summary>
        /// <param name="userid">用户ID。</param>
        /// <param name="status">用户状态。</param>
        /// <param name="bannedUntil">禁用过期时间。</param>
        /// <param name="reason">禁用原因。</param>
        /// <returns>返回是否更新成功。</returns>
        public abstract bool SetAccountStatus(int userid, AccountStatus status, DateTime bannedUntil, BannedReason reason);
        #endregion

        #region userinvitations
        /// <summary>
        /// 生成用户邀请码。
        /// </summary>
        /// <param name="userID">用户ID。</param>
        /// <param name="count">生成的个数。</param>
        /// <param name="expiredDays">过期天数。</param>
        public abstract void GeneralUserInvitations(int userID, int count, int expiredDays);
        /// <summary>
        /// 获取用户邀请码。
        /// </summary>
        /// <param name="userID">用户ID。</param>
        /// <returns>返回用户邀请码。</returns>
        public abstract List<UserInvitation> GetUserInitations(int userID);
        /// <summary>
        /// 删除用户邀请码。
        /// </summary>
        /// <param name="userID">用户ID。</param>
        /// <param name="expired">是否过期。</param>
        /// <returns>返回删除用户邀请码的结果。</returns>
        public abstract bool DeleteUserInitations(int userID, bool expired);
        #endregion

        #region search
        /// <summary>
        /// 检索用户。
        /// </summary>
        /// <param name="query">用户查询实例对象。</param>
        /// <param name="size">返回所有用户记录数。</param>
        /// <returns>返回用户列表。</returns>
        public abstract List<User> Search(UserQuery query, out int size);
        #endregion

        #region permissions
        /// <summary>
        /// 拷贝权限方案。
        /// </summary>
        /// <param name="settingsID">网站设置ID。</param>
        /// <param name="targetSchemaID">权限方案ID。</param>
        /// <param name="schemaName">权限方案名称。</param>
        /// <param name="schemaDescription">权限方案描述。</param>
        /// <returns>如果拷贝成功返回<c>true</c>，否则返回<c>false</c>。</returns>
        public abstract bool CopyPermissionSchema(int settingsID, Guid targetSchemaID, string schemaName, string schemaDescription);

        /// <summary>
        /// 创建权限方案。
        /// </summary>
        /// <param name="permissionSchema">权限方案。</param>
        /// <returns>如果创建成功返回<c>true</c>，否则返回<c>false</c>。</returns>
        public abstract bool CreatePermissionSchema(PermissionSchema permissionSchema);

        /// <summary>
        /// 删除权限方案。
        /// </summary>
        /// <param name="settingsID">网站设置ID。</param>
        /// <param name="schemaID">权限方案ID。</param>
        /// <returns>如果删除成功返回<c>true</c>，否则返回<c>false</c>。</returns>
        public abstract bool DeletePermissionSchema(int settingsID, Guid schemaID);

        /// <summary>
        /// 通过类型获取所有权限。
        /// </summary>
        /// <typeparam name="T">权限类型。</typeparam>
        /// <param name="settingsID">网站设置ID。</param>
        /// <returns>通过类型返回所有权限。</returns>
        public abstract Dictionary<Guid, Dictionary<int, T>> GetAllPermissions<T>(int settingsID) where T : PermissionBase, new();

        /// <summary>
        /// 通过类型获取所有权限方案。
        /// </summary>
        /// <param name="settingsID">网站设置ID。</param>
        /// <param name="permissionInstanceType">权限类型，包含域名。</param>
        /// <returns>通过类型返回所有权限方案。</returns>
        public abstract Dictionary<Guid, PermissionSchema> GetAllPermissionSchemas(int settingsID, string permissionInstanceType);

        /// <summary>
        /// 保存权限列表。
        /// </summary>
        /// <param name="permissions">权限列表。</param>
        /// <returns>如果保存成功返回<c>true</c>，否则返回<c>false</c>。</returns>
        public abstract bool SavePermissions(List<PermissionBase> permissions);

        /// <summary>
        /// 更新权限方案。
        /// </summary>
        /// <param name="permissionSchema">权限方案对象实例。</param>
        /// <returns>如果保存成功返回<c>true</c>，否则返回<c>false</c>。</returns>
        public abstract bool UpdatePermissionSchema(PermissionSchema permissionSchema);

        /// <summary>
        /// 加载所有权限方案列表。
        /// </summary>
        /// <param name="settingsID">网站设置ID。</param>
        /// <returns>返回所有权限方案列表。</returns>
        public abstract Dictionary<Guid, PermissionSchema> LoadPermissionSchemas(int settingsID);

        /// <summary>
        /// 获取权限方案。
        /// </summary>
        /// <param name="settingsID">网站设置ID。</param>
        /// <param name="schemaID">方案ID。</param>
        /// <returns>返回权限方案实例对象。</returns>
        public abstract PermissionSchema GetPermissionSchema(int settingsID, Guid schemaID);
        #endregion

        #region profiles
        /// <summary>
        /// 保存用户档案。
        /// </summary>
        /// <param name="profile">用户档案实例对象。</param>
        /// <returns>返回执行结果。</returns>
        public abstract bool SaveProfile(UserProfile profile);

        /// <summary>
        /// 获取用户档案。
        /// </summary>
        /// <param name="settingsID">网站设置ID。</param>
        /// <param name="userID">用户ID。</param>
        /// <returns>返回用户档案实例对象。</returns>
        public abstract UserProfile GetProfile(int settingsID, int userID);
        #endregion
    }
}
